<?php
/**
 * 面对对象编程（OOP）示例
 * 修饰符：
 * 公共的 public  外部可以调用，内部可以继承
 * 私有的 private 外部不能调用，内部可以继承
 * 受保护的 protected 外部不能调用，内部可以继承
 * 静态的 static 可以直接通过类名调用
 * 抽象的 abstract 不能直接实例化，必须被继承
 * 接口的 interface 不能直接实例化，必须被实现
 */

class Person {
    // 定义变量
    public $name;
    protected $age;
    private $money = 1000; // 默认值为1000

    // 定义静态变量
    static $count = "这是一个静态变量";

    // 定义常量
    const PI = 3.14; // 常量值为3.14

    // 用于初始化属性的构造函数
    public function __construct($name = null, $age = null) {
        // 如果传入的参数为null，则不进行赋值
        $this->name = $name;
        $this->age = $age;
    }

    // 显示人员详细信息的方法
    public function displayInfo() {
        echo "Name: " . $this->name . "<br>";
        echo "Age: " . $this->age . "<br>";
        echo "Money: " . $this->money . "<br>";
    }

    // 静态方法
    static function sum($a,$b) {
        return $a + $b;
    }

    public function getAge() {
        return $this->age . "<br>";
    }

    // 获取父类私有属性
    public function getMoney() {
        return $this->money ."<br>";
    }

    // 获取常量
    public function etPi() 
    {
        return self::PI . "<br>";
    }

    public function getBrowser() {
        echo "这是父类的一个方法" . "<br>";
    }
}

// 创建Person类的实例
// 传入姓名和年龄
$person = new Person("John Doe", 20);
var_dump($person);
echo "<br>";

// 访问静态变量
$personStatic = Person::$count;
echo "Static Variable: " . $personStatic . "<br>";

// 调用显示信息的方法
$person->displayInfo();

// 访问常量
echo Person::PI . "<br>";

// 调用静态方法
$sum = Person::sum(10, 20);
echo "Sum: " . $sum . "<br>";

echo $person->getAge();
echo $person->getMoney();

echo $person->etPi();

echo $person->getBrowser();

// 继承父类
class son extends Person {
    public function getBrowser() {
        echo "这是子类的一个方法" . "<br>";
    }

    /**
     * 析构函数
     */
    public function __destruct() {
        echo "在对象调用完成后自动触发的方法" . "<br>";
        $this->name = '';
        echo "<br>";
    }

    public function getUp() {
        echo "起床了" . "<br>";
        return $this; // 返回当前对象，以便链式调用
    }
    public function getEat() {
        echo "吃饭了" . "<br>";
        return $this; // 返回当前对象，以便链式调用
    }
    public function getSleep() {
        echo "睡觉了" . "<br>";
        return $this; // 返回当前对象，以便链式调用
    }
}

// 创建子类的实例
$son = new son("Jane Doe", 25);
var_dump($son);
echo "<br>";
$son->getBrowser();
echo "<br>";
// 对象链调用
$son->getUp()->getEat()->getSleep();
?>